### Proyecto 30 Casa Inteligente **1. Descripción** En esta era tecnológica, todos estamos familiarizados con la casa inteligente. Es un sistema que puede controlar electrodomésticos mediante botones. En este proyecto, buscamos simular una casa inteligente mediante un control remoto IR. Con Arduino MCU como núcleo, puede usarse para controlar luces, aires acondicionados, TV y monitores de seguridad. **2. Diagrama de Flujo** ![](media/B47.png) **3. Diagrama de Conexiones** ![](media/B48.png) **4. Código de Prueba** ``` /* keyestudio ESP32 Inventor Learning Kit Project 30 Smart Home http://www.keyestudio.com */ #include #include #include #include #include LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display const uint16_t recvPin = 19; // Infrared receiving pin IRrecv irrecv(recvPin); // Create a class object used to receive class decode_results results; // Create a decoding results class object long ir_rec; xht11 xht(26); //The DHT11 connects to IO26 unsigned char dat[] = { 0, 0, 0, 0 }; //Define an array to store temperature and humidity data int distance = 0; //Define a variable to receive the distance int EchoPin = 14; //Connect Echo pin to IO14 int TrigPin = 13; //Connect Trig pin to IO13 int ligth_sensor = 33; //Define the photoresistor pin int sound_sensor = 32; //efine the sound sensor pin int pot_sensor = 25; //Define the potentiometer pin void setup() { //LCD 1602 lcd.init(); // initialize the lcd lcd.backlight(); //Turn on the LCD backlight lcd.setCursor(3, 0); lcd.print("keyestudio"); //LCD displays "keyestudio" //IR receiver irrecv.enableIRIn(); // start receiving signals //Ultrasonic pinMode(TrigPin, OUTPUT); //Set Trig pin to output pinMode(EchoPin, INPUT); //Set Echo pin to input } void loop() { if (irrecv.decode(&results)) { if (results.value != 0) { //Prevent the button from being pressed repeatedly ir_rec = results.value; //The signal is assigned to the variable ir_rec show_clear(); } irrecv.resume(); //Release the IRremote and receive the next value. } switch (ir_rec) { case 0xFF02FD: show_clear(); break; case 0xFF6897: show_temperature(); break; case 0xFF9867: show_humidity(); break; case 0xFFB04F: show_distance(); break; case 0xFF30CF: show_luminance(); break; case 0xFF18E7: show_sound(); break; case 0xFF7A85: show_pot(); break; } delay(300); } void show_clear() { //Clear display lcd.setCursor(0, 1); lcd.print(" "); } void show_temperature() { //Display temperature if (xht.receive(dat)) { //Check correct return to true lcd.setCursor(0, 1); lcd.print("Temperature:"); lcd.setCursor(13, 1); lcd.print(dat[2]); if (dat[2] < 100) { lcd.setCursor(15, 1); lcd.print(" "); } } } void show_humidity() { //Display humidity if (xht.receive(dat)) { //Check correct return to true lcd.setCursor(0, 1); lcd.print("Humidity:"); lcd.setCursor(10, 1); lcd.print(dat[0]); Serial.println("2"); if (dat[0] < 100) { lcd.setCursor(12, 1); lcd.print(" "); } } } float checkdistance() { //Acquire distance // preserve a short low level to ensure a clear high pulse: digitalWrite(TrigPin, LOW); delayMicroseconds(2); // Trigger the sensor by a high pulse of 10um or longer digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); // Read the signal from the sensor: a high level pulse //Duration is detected from the point sending "ping" command to the time receiving echo signal (unit: um). float distance = pulseIn(EchoPin, HIGH) / 58.00; //Convert into distance delay(10); return distance; } void show_distance() { //Display the distance distance = checkdistance(); // if (distance < 2 || distance >= 400) { //Disolay "-1" if exceeding the detection range // distance = -1; // } lcd.setCursor(0, 1); lcd.print("distance:"); lcd.setCursor(9, 1); lcd.print(distance); if (distance < 100 && distance > 10) { //Eliminate the third residual digit when the value drops to two digits lcd.setCursor(11, 1); lcd.print(" "); } if (distance < 10) { //Eliminate the second residual digit when the value drops to one digit lcd.setCursor(10, 1); lcd.print(" "); } } void show_luminance() //Read the analog value of photoresistor { int value = analogRead(ligth_sensor); lcd.setCursor(0, 1); lcd.print("Luminance:"); lcd.setCursor(11, 1); lcd.print(value); if (value < 1000) { lcd.setCursor(14, 1); lcd.print(" "); } if (value < 100) { lcd.setCursor(13, 1); lcd.print(" "); } if (value < 10) { lcd.setCursor(12, 1); lcd.print(" "); } } void show_sound() //Read the analog sound value { int value = analogRead(sound_sensor); lcd.setCursor(0, 1); lcd.print("Sound:"); lcd.setCursor(7, 1); lcd.print(value); if (value < 1000) { lcd.setCursor(10, 1); lcd.print(" "); } if (value < 100) { lcd.setCursor(9, 1); lcd.print(" "); } if (value < 10) { lcd.setCursor(8, 1); lcd.print(" "); } } void show_pot() //Read the analog value of potentiometer { int value = analogRead(pot_sensor); lcd.setCursor(0, 1); lcd.print("PotAnalog:"); lcd.setCursor(11, 1); lcd.print(value); if (value < 1000) { lcd.setCursor(14, 1); lcd.print(" "); } if (value < 100) { lcd.setCursor(13, 1); lcd.print(" "); } if (value < 10) { lcd.setCursor(12, 1); lcd.print(" "); } } ``` **5. Resultado de la Prueba** Después de conectar el cableado y subir el código, podemos ver el contenido correspondiente en el LCD al presionar los botones. El botón OK limpia la pantalla del sensor. ![](media/B49.png)